<!DOCTYPE html>
<html>
<head>
	<title></title>
	<link rel="stylesheet" type="text/css" href="../公用CSS文件/all.css" />
	<script type="text/javascript" src="../js/jquery.min.js"></script> 	<script type="text/javascript" src="../js/js.js"></script>
	<meta charset="utf-8">
	<style type="text/css">
		table{width:80%}
	</style>
</head>
<body>

<div class="dt">cookie和session</div>
<ul>
	<div class="ltable showimg">概念</div>
	<div class="img">
		<table>
			<tr>
				<th>概念</th><th>说明</th><th>备注</th>
			</tr>
			<tr>
				<td>cookie</td>
				<td>cookie是一种在客户端存储数据并以此跟踪和识别用户的一种机制，服务器可以在cookie中存储想要存储的信息，在http请求时客户端将cookie发送到服务器供服务端使用</td>
			</tr>
			<tr>
				<td>session</td>
				<td>由于HTTP协议是无状态的协议，服务端无法依靠http识别记录用户的状态，因此需要用某种机制来识具体的用户
					，session机制设计用来进行此种工作：它为每次请求生成一个session_id，并以session_id为标识存储一组数据到服务端，如果下次请求指明了session_id，则被认为和上一次请求为同一个会话，这样就完成了识别和记录用户的功能</td>
			</tr>
			<li>session在计算机语境中一般译为会话，其本意是指有始有终的一系列动作/消息，如打电话从拿起电话到挂断电话的一系列过程</li>
			<li>session_id的识别一般依赖cookie，也可以通过GET/POST传递(基本不用，有安全隐患且不够规范)，PHP也提供了session_id函数，该函数可以设置和读取session_id,</li>
		</table>
		<li>cookie有两种存储方式，一种为存储在内存的临时cookie，一种为存储在硬盘上的cookie。临时cookie在关闭浏览器后就会失效，如果不设置失效时间就会存储为临时cookie</li>
	</div>

	<div class="ltable showimg">cookie和session常用函数</div>
	<div class="img">
		<table>
			<tr>
				<th>函数</th><th>作用</th><th>参数</th><th>返回值</th>
			</tr>
			<tr>
				<td>setcookie</td>
				<td>设置、删除、修改cookie</td>
				<td>str键  str值  【expire时间戳 path路径 domain域  secure是否仅https httponly是否仅http可用】</td>
				<td>布尔值，意义仅在于操作正确与否</td>
			</tr>
			<tr>
				<td>session_start</td>
				<td>开启session机制</td>
				<td>无</td>
				<td>布尔值</td>
			</tr>
			<tr>
				<td>session_id</td>
				<td>获取和设置session_id(必须初始化)</td>
				<td>str字符串</td>
				<td>字符串当前session_id</td>
			</tr>
			<tr>
				<td>session_name</td>
				<td>获取和设置session_id传递使用的键名(默认为PHPSESSID)</td>
				<td>str字符串</td>
				<td>返回设置或获取之前的session_name</td>
			</tr>
			<tr>
				<td>session_set_cookie_params</td>
				<td>设置session_id在cookie的保存方式</td>
				<td>int生存秒 【path路径  domain域  secure是否仅https设置  httponly是否仅http可用】</td>
				<td>布尔值</td>
			</tr>
		</table>
		<li>PHP原生的cookie操作基本都是通过setcookie函数，如果是修改则直接覆盖原值，删除则设置一个低于现在时间戳的expire(两种方式的区别未知)</li>
		<li>session_start函数会自动依据php.ini设置获取session_id并读取session数据，存储到变量$_SESSION中，如果session_id未传递，会创建一个session_id</li>
		<li>session_set_cookie_params参数本质上是设置保存cookie中的session_id时传递的参数的值，该函数需要在session初始化之前调用，php7.3后接受options数组参数(修改php.ini设置和初始化之后使用setcookie函数能达到一致的效果)</li>
	</div>

	<div class="ltable showimg">session和cookie的区别</div>
	<div class="img">
		<li>session存储在服务器，安全性高、操作相对方便灵活，占用的服务器资源大</li>
		<li>cookie存储在客户端，安全性低，不占用服务器资源</li>
	</div>

	<div class="ltable showimg">php.ini文件session配置</div>
	<div class="img">
		<table>
			<tr>
				<th>配置</th><th>配置项</th><th>说明和可能取值</th>
			</tr>
			<tr>
				<td>session保存方式</td>
				<td>session.save_handler</td>
				<td>file、redis</td>
			</tr>
			<tr>
				<td>session保存路径</td>
				<td>session.save_path</td>
				<td>路径，可以为目录、tcp地址等</td>
			</tr>
			<tr>
				<td>session关联cookie</td>
				<td>session.use_cookie</td>
				<td>是否使用cookie传递的id来获取session</td>
			</tr>
			<tr>
				<td>session仅关联cookie</td>
				<td>session.use_only_cookie</td>
				<td>是否仅使用cookie传递的session_id</td>
			</tr>
			<tr>
				<td>session是否使用url传递</td>
				<td>session.use_trans_sid</td>
				<td>设置为真，session_id会作为get参数传递</td>
			</tr>
			<tr>
				<td>session_id传递时的键值</td>
				<td>session.name</td>
				<td>该值默认为PHPSESSID</td>
			</tr>
			<tr>
				<td>session是否自动开启</td>
				<td>session.auto_start</td>
				<td>默认不开启，需要使用session_start()函数开启</td>
			</tr>
			<tr>
				<td>session过期时间</td>
				<td>session.gc_maxlifetime</td>
				<td>默认24分钟，以秒为单位</td>
			</tr>
			<tr>
				<td>session过期后缓冲时间</td>
				<td>session.cache_expire</td>
				<td>默认180分钟，失效后删除前缓冲时间</td>
			</tr>
			<tr>
				<td>session回收机制启动几率</td>
				<td>session.gc_probability</td>
				<td>周期内初始化session启动回收机制的次数</td>
			</tr>
			<tr>
				<td>session回收机制周期</td>
				<td>session.gc_divisor</td>
				<td>启动session回收时每个周期以多少次初始化为标准</td>
			</tr>
			<tr>
				<td>session域</td>
				<td>session.cookie_domain</td>
				<td>session的域，子域使用同一个session数据</td>
			</tr>
			<tr>
				<td>session使用cookie的生命周期</td>
				<td>session.cookie_lifetime</td>
				<td>session机制设置cookie时cookie的有效期，单位秒</td>
			</tr>
			<tr>
				<td>session完全级别</td>
				<td>session.use_strict_model</td>
				<td>是否仅使用经过session机制初始化的session_id</td>
			</tr>
		</table>
		<li>cache_expire设置的缓冲时间目的是为了减少磁盘I/O</li>
		<li>在不使用cookie的情况下，开启session.use_trans_sid配置能从表单和get提交的数据中自动获取session_id，此时存在安全漏洞，必须调高session完全级别开启session.use_strict_model配置，不过这样的做法在实际项目中一般不使用(使用token)</li>
	</div>
</ul>

<div class="dt">http参数接收</div>
<ul>
	<div class="ltable showimg">$_GET</div>
	<div class="img">
		<table>
			<tr></tr>
		</table>
	</div>
</ul>

<div class="dt">文件上传与处理</div>
<ul>
	<div class="ltable showimg">文件上传处理方式</div>
	<div class="img">
		<table>
			<tr>
				<th>方式</th><th>说明</th>
			</tr>
			<tr>
				<td>使用$_FILES访问上传文件信息</td>
				<td>该种方式需要在form表单中加入enctype="multipart/form-data"</td>
			</tr>
			<tr>
				<td>@读取"php://input"这个特殊原始只读数据流，该方式只能读取直接以二进制发送的图片内容(其实也能通过$_POST等接受)</td>
				<td>如果表单中有enctype="multipart/form-data"，该只读数据流失效</td>
			</tr>
		</table>
	</div>

	<div class="ltable showimg">$_FILES详解</div>
	<div class="img">
		<table>
			<tr>
				<th style="min-width: 20%">文件信息字段</th>
				<th style="min-width: 20%">说明</th>
			</tr>
			<tr>
				<td>name</td><td>原文件的名称</td>
			</tr>
			<tr>
				<td>type</td><td>文件mime类型</td>
			</tr>
			<tr>
				<td>tmp_name</td><td>上传文件临时存储路径</td>
			</tr>
			<tr>
				<td>error</td><td>错误码，为0时上传完全成功</td>
			</tr>
			<tr>
				<td>size</td><td>文件字节大小</td>
			</tr>
		</table>
		<li>$_FILES以每一个表单中的name属性为key，以数组值的形式存储上述上传文件信息，如果name属性符合数组规则，多余的信息会叠加到值中，每一个字段都会以索引数组存储相关信息</li>
	</div>

	<div class="ltable showimg">上传文件相关函数</div>
	<div class="img">
		<table>
			<tr>
				<th>函数</th><th>作用</th><th>参数</th><th>返回值</th>
			</tr>
			<tr>
				<td>is_upload_file</td>
				<td>判断是否是上传文件</td>
				<td>str文件地址</td>
				<td>布尔值</td>
			</tr>
			<tr>
				<td>move_upload_file</td>
				<td>移动上传文件</td>
				<td>str原文件  destination目的路径</td>
				<td>布尔值</td>
			</tr>
		</table>
		<li>该系列函数原则上只能操作$_FILES中一个文件信息数组中的tmp_name文件，该路径的目录是用来临时存储上传到服务器的文件</li>
	</div>
</ul>

<div class="dt">Iterator迭代器</div>
<ul>
	<div class="ltable showimg">迭代器概念</div>
	<div class="img">
		<li>迭代器是PHP官方公提供的Iterator等一系列接口类，主要用途是用来实现数据结构和遍历方式和算法的分离</li>
		<li>PHP自带的系列迭代器，除了ArrayIterator等几个继承Iterator类，很多其他的迭代器都和Iterator没有继承关系，但使用is_iterable检测，仍然是true</li>
	</div>

	<div class="ltable showimg">Iterator接口方法</div>
	<div class="img">
		<table>
			<tr>
				<th>函数</th><th>作用</th><th>参数</th><th>返回值</th>
			</tr>
			<tr>
				<td>rewind</td>
				<td>返回迭代器的第一个元素，迭代初始化调用</td>
				<td>无</td>
			</tr>
			<tr>
				<td>valid</td>
				<td>检测当前元素是否存在，如果不存在，终止迭代</td>
				<td>无</td>
			</tr>
			<tr>
				<td>current</td>
				<td>返回当前元素</td>
				<td>无</td>
			</tr>
			<tr>
				<td>key</td>
				<td>返回当前键</td>
				<td>无</td>
			</tr>
			<tr>
				<td>next</td>
				<td>向前移动到下一位元素</td>
				<td>无</td>
			</tr>
		</table>
		<li>在迭代器被foreach遍历时，rewind先被调用，初始化迭代器，然后循环调用valid->current->key->next</li>
		<li>官网文档虽然说这些方法返回值有些被转化有些无效，但其实不对，返回值可以为任意值且都有效，在foreach遍历时，会根据valid返回值的真假判断遍历是否已经结束</li>
		<li>面向对象中，可以用is_a或者is_subclass_of判断是否是实施了某接口的类的对象，在foreach遍历时，可能是通过这种方式区分普通对象和迭代器对象的遍历的</li>
	</div>


	<div class="ltable showimg">相关函数</div>
	<div class="img">
		<table>
			<tr>
				<th>函数</th><th>作用</th><th>参数</th><th>返回值</th>
			</tr>
			<tr>
				<td>is_iterable</td>
				<td>检测数据是否是一个可迭代的值(数组、对象或实施了Iterator接口)</td>
				<td>要检查的值</td>
				<td>布尔值</td>
			</tr>
		</table>
	</div>
</ul>

<div class="dt">Generator生成器</div>
<ul>
	<div class="ltable showimg">Generator生成器</div>
	<div class="img">
		<li>生成器提供了一种更容易的方法来实现简单的对象迭代，相比较定义类实现 Iterator 接口的方式，性能开销和复杂性大大降低。</li>
		<li>生成器允许你在 foreach 时调用生成器函数来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限，或者会占据可观的处理时间。
			相反，你可以写一个生成器函数，就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次，以便生成需要迭代的值。</li>
	</div>

	<div class="ltable showimg">Generator特性</div>
	<div class="img">
		<li>Generator实施了Iterator迭代器接口，但和普通对象数组的迭代不一致的是，Genetator是在迭代的时候运行对应的生成器函数yield下一个值而不是从数据集合中取出</li>
		<li>Generator不能直接实例化，也无法被克隆，一旦被迭代完成，就无法rewind重置</li>
	</div>

	<div class="ltable showimg">yield关键字</div>
	<div class="img">
		<li>yield关键字仅用在函数内部，在对应的生成器遍历时生成值</li>
		<li>只要函数内部包含yield关键字，生成的都是Generator生成器，同时包含的return只会终止函数执行，此时return的值无意义</li>
		<li>可以使用生成器Generator的send方法，为当前迭代的yield表达式赋予一个返回值，可以用变量接受这个yield返回的值（默认null）</li>
	</div>

</ul>

<div class="dt">namespace命名空间</div>
<ul>
	<div class="ltable showimg">命名空间概述</div>
	<div class="img">
		<li>命名空间namespace是PHP5.3.0版本后增加的一项功能，命名空间本身是借鉴自操作系统的文件夹功能，类似于文件夹与文件的关系，
			命名空间用来封装各自空间内的类、函数、常量(实际项目很难见到)，以便于更有逻辑性地拆分组织各自空间内的功能块</li>
		<li>命名空间名合法字符与PHP函数、常量、变量、类的合法字符一致且同样不区分大小写，以'\'符号分层，但在PHP5.6和之前的版本，也能以'/'分层</li>
		<li>名为PHP或php的命名空间，以及以这些名字开头的命名空间（例如PHP\Classes）被保留用作语言内核使用，而不应该在用户空间的代码中使用</li>
	</div>

	<div class="ltable showimg">use关键字</div>
	<div class="img">
		<table>
			<tr>
				<th>use</th><th>说明</th><th>备注</th>
			</tr>
			<tr>
				<td>概念</td>
				<td>use关键字和namespace同时更新的语法，最初只是用来为连带命名空间的类、函数、常量在本命名空间内取一个别名</td>
				<td>use之后不使用as默认别名为剔除命名空间的纯命名</td>
			</tr>
			<tr>
				<td>use模拟闭包</td>
				<td>在匿名函数中参数位的右边use一个额外参数列表，表示函数内部的这些参数，直接可以使用外一个层级的作用域的同名变量</td>
			</tr>
			<tr>
				<td>use特殊类trait</td>
				<td>在类声明时，类成员声明描述之前use一个trait，表示该类直接</td>
			</tr>
		</table>
	</div>

	<div class="ltable showimg">use和namespace</div>
	<div class="img">
		<img src="img/use和namespace.png">
	</div>

	<div class="ltable showimg">use模拟闭包功能</div>
	<div class="img">
		<img src="img/use外部变量.png">
	</div>

	<div class="ltable showimg">use特殊类trait</div>
</ul>




</body>
</html>